/*
 * Copyright © 2021 http://www.hn-szzy.com/ All rights reserved.
 */
package com.xjh.basestudy.javabase.annotation;


import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author： 徐建华
 * @date： 2022/1/3
 * @description：
 */
//id有默认值，可以不写，mes没有默认值，所以必写，否则报错
@TestAnnotation(msg = "hello annotation")
public class TestUseAnnotation {
    public static void main(String[] args) {
        //通过反射获取注解
        //通过 Class 对象的 isAnnotationPresent() 方法判断该类是否使用了某个注解
        boolean hasAnnotation = TestUseAnnotation.class.isAnnotationPresent(TestAnnotation.class);
        //如果使用了该注解
        if (hasAnnotation) {
            //通过 getAnnotation() 方法来获取 注解 对象
            TestAnnotation testAnnotation = TestUseAnnotation.class.getAnnotation(TestAnnotation.class);
            //得到并输出注解里的属性信息
            System.out.println("获取类注解的参数id:" + testAnnotation.id());
            System.out.println("获取类注解的参数msg:" + testAnnotation.msg());
        }


        //    测试获取变量上的注解的属性信息
        try {
            Field a = TestUseAnnotation.class.getDeclaredField("testProperty");//参数是变量名
            a.setAccessible(true);
            //获取一个成员变量上的注解
            TestAnnotation check = a.getAnnotation(TestAnnotation.class);
            if (check != null) {
                System.out.println("获取变量注解的参数:" + check.msg());
            }


            //测试获取方法上的注解的属性信息
            Method testMethod = TestUseAnnotation.class.getDeclaredMethod("testMethod");
            if (testMethod != null) {
                // 获取方法中的注解
                Annotation[] ans = testMethod.getAnnotations();
                for (int i = 0; i < ans.length; i++) {
                    System.out.println("获取方法注解的参数:" + ans[i].annotationType().getSimpleName());
                }
            }
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e.getMessage());
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e.getMessage());
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }


    @TestAnnotation(msg = "jjj")
    int testProperty;

    @TestAnnotation(msg = "aaa")
    public void testMethod() {
    }

}
